#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
using namespace std;

void handler(int signo)
{
    cout << "i am process, my pid : " << getpid() << endl;
    exit(-1);
}

int main()
{
    //很多不同的信号都是要终止进程，设计这么多的不同的信号不仅仅是为了产生不同的信息供程序员识别错误
    //就比如core 和 trem，core是先产生核心转储文件之后再终止进程，而trem只做终止进程这一件事
    //ulimit -a可以查看核心转储文件是否被打开--一般的云服务器的环境都是生产环境，默认是关闭的。
            //形成的核心转储文件可以帮助我们快速的定位到问题
    while(true)
    {
        cout << "holle my pid is : " << getpid() << endl;
        sleep(1);
    }

    // signal(11, handler);
    // int* ps = nullptr;
    // *ps = 100;//引发MMU硬件报错，过程和下面一样，OS检测到之后，向对应的进程写信号
    // //死循环产生的原因和下面的一样
    // cout << "@@@@@@@@@@@@@@@@@" << endl;

    // signal(SIGFPE, handler);
    // int a = 10;
    // a /= 0;//除零会引发CPU异常（即硬件异常）,OS发现CPU异常之后，会找到对应的进程，向该进程写信号(8)
    // //造成死循环的原因是因为: 在捕捉到8号信号之后，进行handler之后进程并没有退出，CPU硬件异常的标识没有被重置，OS检测到之后就会一直向进程发送信号
    // //从而导致进程一直死循环调用handler方法
    // cout << "#############" << endl;

    return 0;
}